package poj1144;

import java.util.Scanner;


/*
POJ1144
思路：计算割点数量
测试数据：
5
5 1 2 3 4
0
6
2 1 3
5 4 6 2
0
0
*/
public class Main {

	//链式前向星保存图数据
	static int maxv = 101;
	static int maxe = 101;
	//头节点数组
	static int[] head = new int[maxv];
	//边集数组
	static Edge[] edge = new Edge[maxe];
	//边数组的下标
	static int cnt = 0;
		
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int n=Integer.parseInt(sc.nextLine());
		//循环获取测试用例
		while(n!=0) {
			System.out.println("用例：");
			//初始化头节点数组
			for(int i=0;i<maxv;i++) {
				head[i] = -1;
			}
			
			for(int i=0;i<n;i++) { //获取用例数据
				String line = sc.nextLine();
				
				if(line.equals("0")) //用例获取结束 
					break;
				
				//构建图
				System.out.println(line);
				
				String[] nums = line.split(" "); 
				int u = Integer.parseInt(nums[0]);
				for(int j=1;j<nums.length;j++) {
					//双向添加边，w默认都为1
					add(u,Integer.parseInt(nums[j]),1);
					add(Integer.parseInt(nums[j]),u,1);
				}
				
			}
			
			//打印链式前向星图
			for(int i=1;i<=n;i++) {
				System.out.printf("head[%d]:%d",i,head[i]);
				for(int j=head[i];j!=-1;j=edge[j].next) {
					System.out.printf("-->(to:%d,w:%d,next:%d)",edge[j].to,edge[j].w,edge[j].next);
				}
				System.out.printf("\n");
			}
			
			//Tarjan计算割点
			tarjan_gedian(1,1);
			tarjan_reset();
			
			
			//清空链式前向星数据
			head = new int[maxv];
			edge = new Edge[maxe];
			cnt = 0;
			System.out.println("--------------------");
			
			n = Integer.parseInt(sc.nextLine());
		}

	}
	
	//添加边的方法
	static void add(int u,int v,int w) {
        //edge[cnt].to = u;
        //edge[cnt].w = w;
        //节点前插
        //edge[cnt].next = head[u];
		edge[cnt] = new Edge(v,head[u],w);

		//head[u]更新为当前边的数组下标
		head[u] = cnt;
		//下标加1
		cnt++;
	}
	
	//时间戳
	static int[] dfn = new int[maxv];
	//追溯点
	static int[] low = new int[maxv];
	//计数器
	static int num = 0;
	//初始化Tarjan算法共用变量，dfn[]，low[]，num
	static void tarjan_reset() {
		for(int i=0;i<maxv;i++) {
			dfn[i] = 0;
			low[i] = 0;
		}
		num = 0;
	}
	//无向图割点Tarjan算法
	//u:节点编号
	//root:DFS遍历树的根
	static void tarjan_gedian(int u,int fa) {
		num++;
		dfn[u] = num;
		low[u] = num;
		//计数
		int count = 0;
		//遍历该节点的边
		for(int i=head[u];i!=-1;i=edge[i].next) {
			int v = edge[i].to; //连接的点

			if(v==fa) //排除父节点
				continue;
			
			if(dfn[v]==0) {//没有访问过的点
				//dfs搜索
				//u为v的父
				tarjan_gedian(v,u);
				//回溯时更新追溯点
				low[u] = Math.min(low[u], low[v]);
				
				//割点判断条件
				if(low[v]>=dfn[u]) {
					//符合条件的子节点做计数
					count++;
					if(u!=fa||count>1) {
						System.out.printf("%d是割点\n", u, v);
					}
				}
				
			}else {//访问过的点
				low[u] = Math.min(low[u], dfn[v]);
			}
		}
	}

}

//描述边的类
class Edge{
	//to:链接的节点
	//next:下一个边，-1表示没有
	//w:边的权值
	int to,next,w;
	public Edge(int to,int next,int w) {
		this.to = to;
		this.next = next;
		this.w = w;
	}
}


